package awk.script.javassist.class03;


import javassist.*;

import java.lang.reflect.Constructor;

/**
 * Created by ssr on 2020/9/15.
 */
public class JavassistTest02 {
    public static void main(String[] args) throws Exception {

        // 获取 ClassPool 对象，使用系统默认类路径
        ClassPool classPool = ClassPool.getDefault();
        // 创建一个空类
        CtClass ctClass = classPool.makeClass("Test");
        ctClass.setName("Test1");

        // 新增 String 类型字段 script
        CtField script = new CtField(classPool.get(String.class.getName()), "script", ctClass);
        script.setModifiers(Modifier.PRIVATE);
        ctClass.addField(script);
        // 新增 String 类型字段 methodName
        CtField methodName = new CtField(classPool.get(String.class.getName()), "methodName", ctClass);
        methodName.setModifiers(Modifier.PRIVATE);
        ctClass.addField(methodName);

        // 无参构造方法
        CtConstructor ctConstructor = new CtConstructor(new CtClass[]{}, ctClass);
        // 方法体
        ctConstructor.setBody("{script=\"test\";methodName=\"test2\";}");
        ctClass.addConstructor(ctConstructor);

        // 有参构造方法
//        CtConstructor ctConstructor1 = new CtConstructor(new CtClass[]{classPool.get(String.class.getName()), CtClass.intType}, ctClass);
//        // 方法体  $0 代表this  $1 $2 方法参数 name age
//        ctConstructor1.setBody("{$0.script = $1;$0.methodName = $2;}");
//        ctClass.addConstructor(ctConstructor1);


        //创建 getter  setter 方法
        ctClass.addMethod(CtNewMethod.setter("setScript", script));
        ctClass.addMethod(CtNewMethod.getter("getScript", script));
        ctClass.addMethod(CtNewMethod.setter("setMethodName", methodName));
        ctClass.addMethod(CtNewMethod.getter("getMethodName", methodName));


        // 写入文件
        //ctClass.writeFile("D:\\漏洞分析\\Commons Collections 3.1\\src\\main\\java\\javassist\\test");

        //将创建的ctClass加载至当前线程的上下文类加载器中
        Class clz = ctClass.toClass();

        //反射调用
        Constructor declaredConstructor = clz.getDeclaredConstructor();
        String script1 = "function helloFunction(name) { return 'Hello everybody,' + name;}";
        String methodName1 = "helloFunction";
        Object obj = declaredConstructor.newInstance();

    }
}
